// прерывание по переполнению Таймера/Счетчика 0 каждые 2 мс
interrupt [TIM0_OVF] void timer0_int(void)
{
static byte key_pressed_counter=20;
static byte column=FIRST_COLUMN;
static unsigned row_data,crt_key;

// заново инициализируем Таймер/Счетчик 0
INIT_TIMER0;
row_data<<=4;

// получим группу 4 кнопок в переменной row_data
row_data|=~KEYIN&0xf;
column>>=1;
if (column==(LAST_COLUMN>>1))
  {
       column=FIRST_COLUMN;
  if (--key_pressed_counter==9) crt_key=row_data;
  else
    {
      if (row_data!=crt_key) key_pressed_counter=10;
      else
        {
             if (!key_pressed_counter)
               {
                 keys=row_data;
                 key_pressed_counter=10;
               };
           };
       };  
       row_data=0;
  };
// выберем следующий столбец, входы будут 
// с подтягивающими резисторами
KEYOUT=~column;
}
